{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "_cell_guid": "4d5be342-abe9-4c95-98fd-c904762ecca9",
    "_uuid": "47570c242f4774c5d670093b822cf6a3f3a91ba9"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.metrics import classification_report, f1_score, precision_score, recall_score\n",
    "from sklearn.utils import class_weight\n",
    "\n",
    "import tensorflow as tf\n",
    "\n",
    "from keras import layers\n",
    "from keras.preprocessing.sequence import pad_sequences\n",
    "from keras.models import Model, Sequential, Input\n",
    "import keras\n",
    "\n",
    "from keras_contrib.layers import CRF\n",
    "from keras_contrib.losses import crf_loss\n",
    "from keras_contrib.metrics import crf_accuracy\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "import pygal\n",
    "import json\n",
    "\n",
    "gpus = tf.config.experimental.list_physical_devices(device_type='GPU')\n",
    "for gpu in gpus:\n",
    "    tf.config.experimental.set_memory_growth(gpu, True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv('data.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>text</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>广</td>\n",
       "      <td>B_ORG</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>西</td>\n",
       "      <td>I_ORG</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>壮</td>\n",
       "      <td>I_ORG</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>族</td>\n",
       "      <td>I_ORG</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>自</td>\n",
       "      <td>I_ORG</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>200749</th>\n",
       "      <td>公</td>\n",
       "      <td>O</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>200750</th>\n",
       "      <td>开</td>\n",
       "      <td>O</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>200751</th>\n",
       "      <td>发</td>\n",
       "      <td>O</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>200752</th>\n",
       "      <td>布</td>\n",
       "      <td>O</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>200753</th>\n",
       "      <td>）</td>\n",
       "      <td>O</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>200754 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       text  label\n",
       "0         广  B_ORG\n",
       "1         西  I_ORG\n",
       "2         壮  I_ORG\n",
       "3         族  I_ORG\n",
       "4         自  I_ORG\n",
       "...     ...    ...\n",
       "200749    公      O\n",
       "200750    开      O\n",
       "200751    发      O\n",
       "200752    布      O\n",
       "200753    ）      O\n",
       "\n",
       "[200754 rows x 2 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "WORD_NUM = 60"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# print(df.shape)\n",
    "# df = df[df['label'].map(lambda x: x.replace(' ', '') not in ['O', 'OO', '0'])]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "text_list = df[df['text'] == '。'].index.tolist()\n",
    "text_list = list(map(lambda x: x + 1, text_list))\n",
    "text_list.insert(0, 0)\n",
    "\n",
    "x = []\n",
    "y = []\n",
    "\n",
    "for m in range(len(text_list)):\n",
    "    if m == 0:\n",
    "        x.append(list(''.join(map(str, df.iloc[:text_list[m + 1], 0].tolist()))))\n",
    "        y.append(df.iloc[:text_list[m + 1], 1].tolist())\n",
    "    elif m == len(text_list) - 1:\n",
    "        continue\n",
    "    else:\n",
    "        x.append(list(''.join(map(str, df.iloc[text_list[m]: text_list[m + 1], 0].tolist()))))\n",
    "        y.append(df.iloc[text_list[m]: text_list[m + 1], 1].tolist())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['广',\n",
       " '西',\n",
       " '壮',\n",
       " '族',\n",
       " '自',\n",
       " '治',\n",
       " '区',\n",
       " '人',\n",
       " '民',\n",
       " '政',\n",
       " '府',\n",
       " '关',\n",
       " '于',\n",
       " '同',\n",
       " '意',\n",
       " '广',\n",
       " '西',\n",
       " '那',\n",
       " '林',\n",
       " '自',\n",
       " '治',\n",
       " '区',\n",
       " '级',\n",
       " '自',\n",
       " '然',\n",
       " '保',\n",
       " '护',\n",
       " '区',\n",
       " '面',\n",
       " '积',\n",
       " '和',\n",
       " '界',\n",
       " '线',\n",
       " '确',\n",
       " '定',\n",
       " '方',\n",
       " '案',\n",
       " '的',\n",
       " '批',\n",
       " '复',\n",
       " '(',\n",
       " '桂',\n",
       " '政',\n",
       " '函',\n",
       " '〔',\n",
       " '2',\n",
       " '0',\n",
       " '1',\n",
       " '9',\n",
       " '〕',\n",
       " '5',\n",
       " '3',\n",
       " '号',\n",
       " ')',\n",
       " '自',\n",
       " '治',\n",
       " '区',\n",
       " '林',\n",
       " '业',\n",
       " '局',\n",
       " '：',\n",
       " '你',\n",
       " '局',\n",
       " '（',\n",
       " '原',\n",
       " '自',\n",
       " '治',\n",
       " '区',\n",
       " '林',\n",
       " '业',\n",
       " '厅',\n",
       " '）',\n",
       " '关',\n",
       " '于',\n",
       " '广',\n",
       " '西',\n",
       " '那',\n",
       " '林',\n",
       " '自',\n",
       " '治',\n",
       " '区',\n",
       " '级',\n",
       " '自',\n",
       " '然',\n",
       " '保',\n",
       " '护',\n",
       " '区',\n",
       " '面',\n",
       " '积',\n",
       " '和',\n",
       " '界',\n",
       " '线',\n",
       " '确',\n",
       " '定',\n",
       " '方',\n",
       " '案',\n",
       " '的',\n",
       " '请',\n",
       " '示',\n",
       " '收',\n",
       " '悉',\n",
       " '。']"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['B_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'B_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'B_T',\n",
       " 'I_T',\n",
       " 'I_T',\n",
       " 'I_T',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'B_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'B_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'I_ORG',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'B_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'I_LOC',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O',\n",
       " 'O']"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# for m, n in enumerate(x):\n",
    "#     if len(n) == 0:\n",
    "#         print(m)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "del x[1402]\n",
    "del y[1402]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1723"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "count    1723.000000\n",
       "mean      116.366802\n",
       "std       361.007044\n",
       "min         6.000000\n",
       "25%        30.000000\n",
       "50%        54.000000\n",
       "75%        98.000000\n",
       "max      8639.000000\n",
       "dtype: float64"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.Series([len(i) for i in x]).describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "remove_list = []\n",
    "for m, n in enumerate(x):\n",
    "    if len(n) > 300:\n",
    "        remove_list.append(m)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = [n for m, n in enumerate(x) if m not in remove_list]\n",
    "y = [n for m, n in enumerate(y) if m not in remove_list]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1639"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "count    1639.000000\n",
       "mean       65.527151\n",
       "std        50.569338\n",
       "min         6.000000\n",
       "25%        29.000000\n",
       "50%        51.000000\n",
       "75%        87.000000\n",
       "max       299.000000\n",
       "dtype: float64"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.Series([len(i) for i in x]).describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "def create(i):\n",
    "    global num\n",
    "    temp = []\n",
    "    \n",
    "    for g in i:\n",
    "        try:\n",
    "            corpus[g]\n",
    "            temp.append(corpus[g])\n",
    "        except:\n",
    "            corpus[g] = num\n",
    "            temp.append(corpus[g])\n",
    "            num += 1\n",
    "    return temp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "corpus = {}\n",
    "corpus['<PAD>'] = 0\n",
    "corpus['<UNK>'] = 1\n",
    "\n",
    "num = 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "text = []\n",
    "for i in x:\n",
    "    temp = create(i)\n",
    "    text.append(temp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[2,\n",
       " 3,\n",
       " 4,\n",
       " 5,\n",
       " 6,\n",
       " 7,\n",
       " 8,\n",
       " 9,\n",
       " 10,\n",
       " 11,\n",
       " 12,\n",
       " 13,\n",
       " 14,\n",
       " 15,\n",
       " 16,\n",
       " 2,\n",
       " 3,\n",
       " 17,\n",
       " 18,\n",
       " 6,\n",
       " 7,\n",
       " 8,\n",
       " 19,\n",
       " 6,\n",
       " 20,\n",
       " 21,\n",
       " 22,\n",
       " 8,\n",
       " 23,\n",
       " 24,\n",
       " 25,\n",
       " 26,\n",
       " 27,\n",
       " 28,\n",
       " 29,\n",
       " 30,\n",
       " 31,\n",
       " 32,\n",
       " 33,\n",
       " 34,\n",
       " 35,\n",
       " 36,\n",
       " 11,\n",
       " 37,\n",
       " 38,\n",
       " 39,\n",
       " 40,\n",
       " 41,\n",
       " 42,\n",
       " 43,\n",
       " 44,\n",
       " 45,\n",
       " 46,\n",
       " 47,\n",
       " 6,\n",
       " 7,\n",
       " 8,\n",
       " 18,\n",
       " 48,\n",
       " 49,\n",
       " 50,\n",
       " 51,\n",
       " 49,\n",
       " 52,\n",
       " 53,\n",
       " 6,\n",
       " 7,\n",
       " 8,\n",
       " 18,\n",
       " 48,\n",
       " 54,\n",
       " 55,\n",
       " 13,\n",
       " 14,\n",
       " 2,\n",
       " 3,\n",
       " 17,\n",
       " 18,\n",
       " 6,\n",
       " 7,\n",
       " 8,\n",
       " 19,\n",
       " 6,\n",
       " 20,\n",
       " 21,\n",
       " 22,\n",
       " 8,\n",
       " 23,\n",
       " 24,\n",
       " 25,\n",
       " 26,\n",
       " 27,\n",
       " 28,\n",
       " 29,\n",
       " 30,\n",
       " 31,\n",
       " 32,\n",
       " 56,\n",
       " 57,\n",
       " 58,\n",
       " 59,\n",
       " 60]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "text[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "text = pad_sequences(text, maxlen=WORD_NUM, padding='post', truncating='post', value=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "t = text.astype('str')\n",
    "t = [' '.join(i) for i in t.tolist()]\n",
    "\n",
    "vocabulary = {}\n",
    "for i in corpus.values():\n",
    "    vocabulary[str(i)] = i"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "tfidf = TfidfVectorizer(vocabulary=vocabulary)\n",
    "embedding_matrix_temp = tfidf.fit_transform(t)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1639, 1559)"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "embedding_matrix_temp.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "label = []\n",
    "for i in y:\n",
    "    label += i"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "targ = {\n",
    "    'O': 0,\n",
    "    'B_LOC': 1, 'I_LOC': 2,\n",
    "    'B_ORG': 3, 'I_ORG': 4,\n",
    "    'B_PRO': 5, 'I_PRO': 6,\n",
    "    'B_T': 7, 'I_T': 8\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'O': 0,\n",
       " 'B_LOC': 1,\n",
       " 'I_LOC': 2,\n",
       " 'B_ORG': 3,\n",
       " 'I_ORG': 4,\n",
       " 'B_PRO': 5,\n",
       " 'I_PRO': 6,\n",
       " 'B_T': 7,\n",
       " 'I_T': 8}"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "targ"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "def create_label(i):\n",
    "    temp = []\n",
    "    \n",
    "    for g in i:\n",
    "        temp.append(targ[g])\n",
    "    return temp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "label = []\n",
    "for i in y:\n",
    "    temp = create_label(i)\n",
    "    label.append(temp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "label = pad_sequences(label, maxlen=WORD_NUM, padding='post', truncating='post', value=targ['O'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1639, 60)"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "label.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2,\n",
       "       2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "       0, 7, 8, 8, 8, 0, 0, 0, 0, 0, 3, 4, 4, 4, 4, 4])"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "label[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "remove_list = []\n",
    "for m, n in enumerate(label):\n",
    "    if len(set(n)) == 1 and set(n) == {0}:\n",
    "        remove_list.append(m)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "text = np.array([n for m, n in enumerate(text) if m not in remove_list])\n",
    "label = np.array([n for m, n in enumerate(label) if m not in remove_list])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "embedding_len = len(corpus)\n",
    "n_tag = 9\n",
    "\n",
    "embedding_size = 200\n",
    "lstm_units = 128"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "pca = PCA(n_components=embedding_size)\n",
    "embedding_matrix_temp = pca.fit_transform(embedding_matrix_temp.A.T)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1559, 200)"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "embedding_matrix_temp.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "# embedding_matrix = np.insert(embedding_matrix_temp, -1, np.zeros((1, embedding_size)), axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "_uuid": "ed0bec01d5f74324d79d75e1890fa4819f1acc98"
   },
   "outputs": [],
   "source": [
    "x_train, x_test, y_train, y_test = train_test_split(text, label.reshape(label.shape[0], label.shape[1], 1), test_size=0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((667, 60), (667, 60, 1))"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train.shape, y_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((167, 60), (167, 60, 1))"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_test.shape, y_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.15481859,  7.17419355,  1.99354607,  6.19153675,  1.00198234,\n",
       "       29.89247312,  2.37201365, 23.65957447,  4.11547002])"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "class_weight = class_weight.compute_class_weight(class_weight='balanced', classes=np.unique(label.flatten()), y=label.flatten())\n",
    "class_weight"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "_uuid": "2fa113078dde42fb187ec5f7216e6a2f8717c622",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model_1\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_1 (InputLayer)         (None, 60)                0         \n",
      "_________________________________________________________________\n",
      "embedding_1 (Embedding)      (None, 60, 200)           311800    \n",
      "_________________________________________________________________\n",
      "bidirectional_1 (Bidirection (None, 60, 400)           641600    \n",
      "_________________________________________________________________\n",
      "time_distributed_1 (TimeDist (None, 60, 9)             3609      \n",
      "_________________________________________________________________\n",
      "crf_1 (CRF)                  (None, 60, 9)             189       \n",
      "=================================================================\n",
      "Total params: 957,198\n",
      "Trainable params: 645,398\n",
      "Non-trainable params: 311,800\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "inp = layers.Input(shape=(WORD_NUM, ))\n",
    "x = layers.Embedding(\n",
    "    embedding_len,\n",
    "    embedding_size,\n",
    "    input_length=WORD_NUM,\n",
    "    weights=[embedding_matrix_temp],\n",
    "    trainable=False\n",
    ")(inp)\n",
    "\n",
    "x = layers.Bidirectional(layers.LSTM(embedding_size, return_sequences=True))(x)\n",
    "\n",
    "x = layers.TimeDistributed(layers.Dense(n_tag, activation=\"relu\"))(x)\n",
    "x = CRF(n_tag, sparse_target=True)(x)\n",
    "\n",
    "model = Model(inputs=inp, outputs=x)\n",
    "\n",
    "model.compile(loss=crf_loss,\n",
    "              optimizer='adam',\n",
    "              metrics=[crf_accuracy])\n",
    "\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "_uuid": "124306348431764ee32027ab77412f1b3abf05bd",
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 600 samples, validate on 67 samples\n",
      "Epoch 1/30\n",
      "600/600 [==============================] - 5s 9ms/step - loss: 1.6645 - crf_accuracy: 0.6553 - val_loss: 1.2856 - val_crf_accuracy: 0.7122\n",
      "Epoch 2/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 1.1824 - crf_accuracy: 0.7238 - val_loss: 1.0748 - val_crf_accuracy: 0.7348\n",
      "Epoch 3/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 1.0135 - crf_accuracy: 0.7382 - val_loss: 0.9300 - val_crf_accuracy: 0.7586\n",
      "Epoch 4/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.8744 - crf_accuracy: 0.7595 - val_loss: 0.8378 - val_crf_accuracy: 0.7897\n",
      "Epoch 5/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.7732 - crf_accuracy: 0.7833 - val_loss: 0.7463 - val_crf_accuracy: 0.8222\n",
      "Epoch 6/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.6915 - crf_accuracy: 0.7948 - val_loss: 0.6731 - val_crf_accuracy: 0.8231\n",
      "Epoch 7/30\n",
      "600/600 [==============================] - 4s 7ms/step - loss: 0.6231 - crf_accuracy: 0.8124 - val_loss: 0.6562 - val_crf_accuracy: 0.8203\n",
      "Epoch 8/30\n",
      "600/600 [==============================] - 4s 7ms/step - loss: 0.5651 - crf_accuracy: 0.8292 - val_loss: 0.5563 - val_crf_accuracy: 0.8543\n",
      "Epoch 9/30\n",
      "600/600 [==============================] - 4s 7ms/step - loss: 0.5094 - crf_accuracy: 0.8475 - val_loss: 0.5149 - val_crf_accuracy: 0.8600\n",
      "Epoch 10/30\n",
      "600/600 [==============================] - 5s 8ms/step - loss: 0.4658 - crf_accuracy: 0.8536 - val_loss: 0.4821 - val_crf_accuracy: 0.8662\n",
      "Epoch 11/30\n",
      "600/600 [==============================] - 4s 7ms/step - loss: 0.4330 - crf_accuracy: 0.8673 - val_loss: 0.4801 - val_crf_accuracy: 0.8640\n",
      "Epoch 12/30\n",
      "600/600 [==============================] - 4s 7ms/step - loss: 0.4084 - crf_accuracy: 0.8706 - val_loss: 0.4316 - val_crf_accuracy: 0.8888\n",
      "Epoch 13/30\n",
      "600/600 [==============================] - 4s 7ms/step - loss: 0.3696 - crf_accuracy: 0.8820 - val_loss: 0.4059 - val_crf_accuracy: 0.8920\n",
      "Epoch 14/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.3375 - crf_accuracy: 0.8903 - val_loss: 0.4008 - val_crf_accuracy: 0.8863\n",
      "Epoch 15/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.3120 - crf_accuracy: 0.8962 - val_loss: 0.3786 - val_crf_accuracy: 0.9057\n",
      "Epoch 16/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.3004 - crf_accuracy: 0.8988 - val_loss: 0.3506 - val_crf_accuracy: 0.9026\n",
      "Epoch 17/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.2858 - crf_accuracy: 0.9024 - val_loss: 0.3413 - val_crf_accuracy: 0.9060\n",
      "Epoch 18/30\n",
      "600/600 [==============================] - 4s 7ms/step - loss: 0.2670 - crf_accuracy: 0.9081 - val_loss: 0.3452 - val_crf_accuracy: 0.9132\n",
      "Epoch 19/30\n",
      "600/600 [==============================] - 4s 7ms/step - loss: 0.2518 - crf_accuracy: 0.9134 - val_loss: 0.3348 - val_crf_accuracy: 0.9115\n",
      "Epoch 20/30\n",
      "600/600 [==============================] - 4s 7ms/step - loss: 0.2375 - crf_accuracy: 0.9181 - val_loss: 0.3034 - val_crf_accuracy: 0.9148\n",
      "Epoch 21/30\n",
      "600/600 [==============================] - 4s 7ms/step - loss: 0.2269 - crf_accuracy: 0.9223 - val_loss: 0.3037 - val_crf_accuracy: 0.9280\n",
      "Epoch 22/30\n",
      "600/600 [==============================] - 4s 7ms/step - loss: 0.2173 - crf_accuracy: 0.9262 - val_loss: 0.3055 - val_crf_accuracy: 0.9289\n",
      "Epoch 23/30\n",
      "600/600 [==============================] - 4s 7ms/step - loss: 0.2067 - crf_accuracy: 0.9310 - val_loss: 0.3272 - val_crf_accuracy: 0.9138\n",
      "Epoch 24/30\n",
      "600/600 [==============================] - 4s 7ms/step - loss: 0.1930 - crf_accuracy: 0.9354 - val_loss: 0.3303 - val_crf_accuracy: 0.9298\n",
      "Epoch 25/30\n",
      "600/600 [==============================] - 4s 7ms/step - loss: 0.1806 - crf_accuracy: 0.9409 - val_loss: 0.3013 - val_crf_accuracy: 0.9359\n",
      "Epoch 26/30\n",
      "600/600 [==============================] - 4s 6ms/step - loss: 0.1738 - crf_accuracy: 0.9417 - val_loss: 0.2990 - val_crf_accuracy: 0.9315\n",
      "Epoch 27/30\n",
      "600/600 [==============================] - 4s 7ms/step - loss: 0.1839 - crf_accuracy: 0.9372 - val_loss: 0.2721 - val_crf_accuracy: 0.9367\n",
      "Epoch 28/30\n",
      "600/600 [==============================] - 4s 7ms/step - loss: 0.1758 - crf_accuracy: 0.9421 - val_loss: 0.2543 - val_crf_accuracy: 0.9344\n",
      "Epoch 29/30\n",
      "600/600 [==============================] - 5s 8ms/step - loss: 0.1613 - crf_accuracy: 0.9465 - val_loss: 0.2876 - val_crf_accuracy: 0.9375\n",
      "Epoch 30/30\n",
      "600/600 [==============================] - 4s 7ms/step - loss: 0.1522 - crf_accuracy: 0.9511 - val_loss: 0.2600 - val_crf_accuracy: 0.9294\n"
     ]
    }
   ],
   "source": [
    "# history = model.fit(x_train, y_train, batch_size=256, epochs=30, validation_split=0.1, class_weight=class_weight)\n",
    "history = model.fit(x_train, y_train, batch_size=64, epochs=30, validation_split=0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1cb5fbbe148>"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAApUAAAIVCAYAAACA4QR/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAxOAAAMTgF/d4wjAABa5klEQVR4nO3dd3Rcxd3G8e+serO65aJmW+69AwYDDr2HFnoCgdBJAqmE9ELKG0hIIAFMdwIJ3bTQmzFgXGSMu2zLKm7qsrq0O+8fdyXLRlZdaSXt8zlnz0r3zu7+Voush5k7M8Zai4iIiIhIT7j8XYCIiIiIDHwKlSIiIiLSYwqVIiIiItJjCpUiIiIi0mMKlSIiIiLSYwqVIiIiItJjCpUiIiIi0mMKlSIiIiLSYwqVIiIdMMa8Z4z5jb/rEBHpzxQqRURERKTHFCpFRLrJGBNujPmDMWaHMabMGPOhMWZ+q/PTjTHvG2PKvedXGWPGe88db4xZaYypMMaUGGM+MsbE++/diIj0jEKliEj3/Qk4DTgRSAFeAN4yxqR6z98HvA0kAcnAN4Fy77klwL1AHDAc+B7Q0Ddli4j4nkKliEg3GGNcOCHxDmttjrW2wVr7Z2A7cJm3WQOQDmRYa5ustdnW2r2tzo0BRngf+7G1trqv34eIiK8oVIqIdE8SEAFsO+R4Dk6QBPgGYIF3jDEFxpi/GGOivefOAkYDq4wxOcaYXxpjgvugbhGRXqF/wEREuqcYqMPpbfyi1fExwGcA1tqdwDUAxpgs4EWgGviJtXYdcIn33AzgdaAAeLBvyhcR8S31VIqIdE6Qd2JOuDEmHAgFHgV+ZYwZbYwJNcZ8F8gC/gVgjPmGMSbVGGOASqAJaPK2vdIYk+x97grA7T0vIjIgKVSKiHTOj4DaQ26vAm8A7wL7gPOAE621+d7HHA+sAKqAtcDHwB+8584H1htjqoH3cQLqY33xRkREeoOx1vq7BhEREREZ4NRTKSIiIiI9plApIiIiIj2mUCkiIiIiPaZQKSIiIiI9plApIiIiIj3WbxY/DwsLs8nJyR03FBERERG/KCwsbLDWhrV1rt+EyuTkZAoKCvxdhoiIiIgchjGm6HDnNPwtIiIiIj2mUCkiIiIiPaZQKSIiIiI91m+uqRQRERHpKWtty026zhiDy9W9PkeFShERERnwPB4P+/bto7y8XIGyh0JCQkhPTyc0NLRLj1OoFBERkQFv586duFwuMjMzCQkJ8Xc5A5a1lpKSEvLy8sjKyurSYxUqRUREZEDzeDzU1dUxduxYgoMVbXoqMTGR0tJSPB5Pl4bCNVFHREREBrTm4W5jjJ8rGRyaf45dvYxAoVJEREREekyhUkRERKQXGGMoLy/3dxl9RqFSRERERHpMV7OKiIjIoHP1Y5+xs6SmV547IzGSxV+f26XHrFy5kltuuYWqqirCw8O5++67WbBgAUVFRVx66aXs3r0bYwyzZ8/mkUce4ZNPPuHGG2/E7XbT1NTEjTfeyPXXX98r78dXFCpFREREelFDQwPnnnsuDz74ICeffDLLli3jvPPOIycnhyVLljBq1CjeeOMNAEpLSwG48847+d73vsfFF18MQFlZmd/q7yyFShERERl0utqT2Js2b96My+Xi5JNPBuDoo48mJSWF7OxsjjjiCO6++25uu+02Fi5cyCmnnALA8ccfz69//Wu2bt3KokWLOProo/35FjpF11SKiIiI9LHmZXuOPPJIsrOzmT9/Ps899xxz587F7Xbzne98h1deeYXhw4dz++23c8MNN/i54o6pp1JERESkF40fPx6Px8Obb77JiSeeyPLly9mzZw8zZsxgx44djBw5kgsvvJBTTjmFoUOHUlVVxZ49exg/fjzXXHMNaWlp3H777f5+Gx1SqBQRERHpRaGhoTz33HPccsst3HbbbYSHh/PMM88QHR3N008/zV133UVQUBBNTU386U9/IjY2ljvuuIN33nmH0NBQgoKC+POf/+zvt9Eh0182XU9NTbUFBQX+LkNEREQGGLfbzZYtWxg3bhxBQUH+LmfAa+/naYwptNamtvU4XVMpIiIiIj0WcKFyZ0k1J971Pg98sM3fpYiIiIgMGgEXKuMiQtm6r4ote6v8XYqIiIjIoBFwoTI2MoS4yBB2llT7uxQRERGRQSPgQiVARmJUr23dJCIiIhKIAjNUJkSyb389NQ1N/i5FREREZFAIyFCZmRgJQF6peitFREREfCEgQ2V6YhQAucUKlSIiItI//OIXv+A73/lOu22OO+44XnjhhT6pp6sCMlQ291Rqso6IiIiIbwTkNo0Z3p7KnRr+FhERGZz+fRGU7eid544fBZc81W6T3/72t+zevZu///3vAFRVVZGens6LL77Ij3/8Y2pqaqirq+OS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\n",
      "text/plain": [
       "<Figure size 800x640 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10, 8), dpi=80)\n",
    "plt.plot(history.history['loss'], label='loss')\n",
    "plt.plot(history.history['val_loss'], label='val_loss')\n",
    "plt.title('Loss')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Acc')"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 800x640 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10, 8), dpi=80)\n",
    "plt.plot(history.history['crf_accuracy'], label='train')\n",
    "plt.plot(history.history['val_crf_accuracy'], label='val')\n",
    "plt.legend()\n",
    "plt.title('Acc')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "_uuid": "d69d4e8d2a544352418b1fc7144c6162d05823c5"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "167/167 [==============================] - 0s 3ms/step\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.36575810513096657, 0.9034597873687744]"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(x_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "pre = np.argmax(model.predict(text), axis=-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "target_names = ['O', 'B_LOC', 'I_LOC', 'B_ORG', 'I_ORG', 'B_PRO', 'I_PRO', 'B_T', 'I_T']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           O       0.97      0.98      0.97     35913\n",
      "       B_LOC       0.81      0.49      0.61       775\n",
      "       I_LOC       0.82      0.84      0.83      2789\n",
      "       B_ORG       0.80      0.57      0.66       898\n",
      "       I_ORG       0.90      0.93      0.91      5549\n",
      "       B_PRO       0.98      0.70      0.82       186\n",
      "       I_PRO       0.96      0.93      0.94      2344\n",
      "         B_T       0.90      0.65      0.75       235\n",
      "         I_T       0.91      0.94      0.92      1351\n",
      "\n",
      "    accuracy                           0.94     50040\n",
      "   macro avg       0.89      0.78      0.83     50040\n",
      "weighted avg       0.94      0.94      0.94     50040\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(classification_report(label.flatten(), pre.flatten(), target_names=target_names, zero_division=0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "r_s = recall_score(label.flatten(), pre.flatten(), average=None)\n",
    "p_s = precision_score(label.flatten(), pre.flatten(), average=None)\n",
    "f_s = f1_score(label.flatten(), pre.flatten(), average=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "radar_chart = pygal.Radar(fill=True, range=(0, 1))\n",
    "\n",
    "radar_chart.title = '指标可视化'\n",
    "radar_chart.x_labels = target_names\n",
    "\n",
    "radar_chart.add('Recall', r_s)\n",
    "radar_chart.add('Precision', p_s)\n",
    "radar_chart.add('F1', f_s)\n",
    " \n",
    "radar_chart.render_to_file('result1.svg')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,  2,  3,\n",
       "       17, 18,  6,  7,  8, 19,  6, 20, 21, 22,  8, 23, 24, 25, 26, 27, 28,\n",
       "       29, 30, 31, 32, 33, 34, 35, 36, 11, 37, 38, 39, 40, 41, 42, 43, 44,\n",
       "       45, 46, 47,  6,  7,  8, 18, 48, 49])"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "text[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2,\n",
       "       2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4], dtype=int64)"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pre[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2,\n",
       "       2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "       0, 7, 8, 8, 8, 0, 0, 0, 0, 0, 3, 4, 4, 4, 4, 4])"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "label[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'O': 0,\n",
       " 'B_LOC': 1,\n",
       " 'I_LOC': 2,\n",
       " 'B_ORG': 3,\n",
       " 'I_ORG': 4,\n",
       " 'B_PRO': 5,\n",
       " 'I_PRO': 6,\n",
       " 'B_T': 7,\n",
       " 'I_T': 8}"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "targ"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [],
   "source": [
    "def invert_dict(d):\n",
    "    return dict([(v, k) for (k, v) in d.items()])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{0: 'O',\n",
       " 1: 'B_LOC',\n",
       " 2: 'I_LOC',\n",
       " 3: 'B_ORG',\n",
       " 4: 'I_ORG',\n",
       " 5: 'B_PRO',\n",
       " 6: 'I_PRO',\n",
       " 7: 'B_T',\n",
       " 8: 'I_T'}"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "targ_idx = invert_dict(targ)\n",
    "targ_idx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [],
   "source": [
    "# model.save_weights('model.h5')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "ef881bb13b0dba32d5512df837b6322fe5d9ca99"
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
